package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.Notification;
import com.woniuxy.entity.DTO.NotificationQueryDTO;
import com.woniuxy.mapper.NotificationMapper;
import com.woniuxy.service.INotificationService;
import com.woniuxy.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/17 1:52
 * @Description TODO
 * @Author 系统通知Service实现类
 * @Date 2025/7/16
 * @Description 实现通知相关的业务逻辑
 */
@Service
public class NotificationServiceImpl extends ServiceImpl<NotificationMapper, Notification> implements INotificationService {

    @Autowired
    private NotificationMapper notificationMapper;

    /**
     * 分页多条件查询通知列表
     * 使用MyBatis-Plus的分页插件和条件构造器实现复杂查询
     */
    @Override
    public PageResult<Notification> getNotificationList(NotificationQueryDTO queryDTO) {
        // 创建分页对象，设置当前页码和每页数量
        // 使用PageFactory.defaultPage()可统一项目分页默认设置，便于维护
        Page<Notification> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 创建查询条件构造器
        QueryWrapper<Notification> queryWrapper = new QueryWrapper<>();

        // 用户ID精确查询（为空则查询所有用户通知）
        if (queryDTO.getUserId() != null && !queryDTO.getUserId().isEmpty()) {
            queryWrapper.eq("user_id", queryDTO.getUserId());
        }

        // 是否已读精确查询
        if (queryDTO.getIsRead() != null) {
            queryWrapper.eq("is_read", queryDTO.getIsRead());
        }

        // 通知标题模糊查询
        if (queryDTO.getTitle() != null && !queryDTO.getTitle().isEmpty()) {
            queryWrapper.like("title", queryDTO.getTitle());
        }

        // 创建时间范围查询
        if (queryDTO.getCreateTimeStart() != null) {
            queryWrapper.ge("create_time", queryDTO.getCreateTimeStart());
        }
        if (queryDTO.getCreateTimeEnd() != null) {
            queryWrapper.le("create_time", queryDTO.getCreateTimeEnd());
        }

        // 按创建时间降序排序，确保最新的通知排在前面
        queryWrapper.orderByDesc("create_time");

        // 执行分页查询
        IPage<Notification> notificationPage = notificationMapper.selectPage(page, queryWrapper);

        // 封装分页结果
        PageResult<Notification> pageResult = new PageResult<>();
        pageResult.setPageNum(queryDTO.getPageNum());
        pageResult.setPageSize(queryDTO.getPageSize());
        pageResult.setTotal(notificationPage.getTotal());
        pageResult.setPages((int) notificationPage.getPages());
        pageResult.setList(notificationPage.getRecords());

        return pageResult;
    }

    /**
     * 批量删除通知
     * 直接调用MyBatis-Plus的removeByIds方法实现批量删除
     * 相比循环单个删除，效率更高，减少数据库交互次数
     */
    @Override
    public boolean batchDelete(List<String> ids) {
        return removeByIds(ids);
    }

    /**
     * 标记通知为已读
     * 创建新对象仅更新必要字段，避免覆盖其他属性
     */
    @Override
    public boolean markAsRead(String id) {
        Notification notification = new Notification();
        notification.setId(id);
        notification.setIsRead(1); // 1表示已读状态
        return updateById(notification);
    }

    /**
     * 批量标记通知为已读
     * 使用update方法配合条件构造器，实现一次SQL更新多条记录
     * 相比循环单个更新，减少数据库交互，提高性能
     */
    @Override
    public boolean batchMarkAsRead(List<String> ids) {
        QueryWrapper<Notification> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);

        Notification notification = new Notification();
        notification.setIsRead(1); // 1表示已读状态

        return update(notification, queryWrapper);
    }
}